# Copyright (c) 2009-2021, Google LLC
# All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd

load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix")
load(
    "//upb/bazel:build_defs.bzl",
    "make_shell_script",
)
load(
    ":build_defs.bzl",
    "staleness_test",
)

licenses(["notice"])

exports_files(["staleness_test.py"])

py_library(
    name = "staleness_test_lib",
    testonly = 1,
    srcs = ["staleness_test_lib.py"],
    # This is public only for use by the staleness_test() macro. Please do not
    # depend on this target directly.
    visibility = ["//visibility:public"],
)

py_binary(
    name = "make_cmakelists",
    srcs = ["make_cmakelists.py"],
)

genrule(
    name = "gen_cmakelists",
    srcs = [
        "//upb:BUILD",
    ],
    outs = ["generated-in/CMakeLists.txt"],
    cmd = "$(location :make_cmakelists) " +
          "$(location //upb:BUILD) $@",
    tools = [":make_cmakelists"],
)

genrule(
    name = "copy_protos",
    srcs = [
        "//src/google/protobuf:descriptor_upb_c_proto",
        "//src/google/protobuf:descriptor_upb_minitable_proto",
    ],
    outs = [
        "generated-in/google/protobuf/descriptor.upb.h",
        "generated-in/google/protobuf/descriptor.upb_minitable.c",
        "generated-in/google/protobuf/descriptor.upb_minitable.h",
    ],
    cmd = "cp $(SRCS) $(@D)/generated-in/google/protobuf",
)

staleness_test(
    name = "test_generated_files",
    outs = [
        "CMakeLists.txt",
        "google/protobuf/descriptor.upb.h",
        "google/protobuf/descriptor.upb_minitable.c",
        "google/protobuf/descriptor.upb_minitable.h",
    ],
    generated_pattern = "generated-in/%s",
    tags = ["manual"],
)

# Test the CMake build #########################################################

make_shell_script(
    name = "gen_run_cmake_build",
    out = "run_cmake_build.sh",
    contents = "set -ex\n" +
               "cd $(dirname $1) && cp -r . .. && cd ../..\n" +
               "mkdir build && cd build && cmake ../cmake && make -j8 && make test",
)

sh_test(
    name = "cmake_build",
    srcs = ["run_cmake_build.sh"],
    args = ["$(location :gen_cmakelists)"],
    data = [
        ":copy_protos",
        ":gen_cmakelists",
        "//third_party/utf8_range:utf8_range_srcs",
        "//upb:source_files",
        "//upb/base:source_files",
        "//upb/hash:source_files",
        "//upb/lex:source_files",
        "//upb/mem:source_files",
        "//upb/message:source_files",
        "//upb/mini_descriptor:source_files",
        "//upb/mini_table:source_files",
        "//upb/port:source_files",
        "//upb/reflection:source_files",
        "//upb/text:source_files",
        "//upb/wire:source_files",
    ],
    target_compatible_with = select({
        "@platforms//os:windows": ["@platforms//:incompatible"],
        "//conditions:default": [],
    }),
    deps = ["@bazel_tools//tools/bash/runfiles"],
)

pkg_files(
    name = "upb_cmake_dist",
    srcs = [
        ":copy_protos",
        ":gen_cmakelists",
        "//third_party/utf8_range:utf8_range_srcs",
        "//upb:source_files",
        "//upb/base:source_files",
        "//upb/hash:source_files",
        "//upb/lex:source_files",
        "//upb/mem:source_files",
        "//upb/message:source_files",
        "//upb/mini_descriptor:source_files",
        "//upb/mini_table:source_files",
        "//upb/port:source_files",
        "//upb/reflection:source_files",
        "//upb/text:source_files",
        "//upb/wire:source_files",
    ],
    strip_prefix = strip_prefix.from_root(""),
    visibility = ["//rust:__pkg__"],
)
